 PAG
******************
*      SEG6
******************

]segnum = #$0600 ;current segment number

 MX %11

 ORG $E0C800

MSGBORDR
 ASC " | M = STK REA WRI LNG BNK PG2 80S CXR  "
 DFB " ","|",38
 DFB " ","|",38
 ASC " | KEY BRK TYP SAV TXT MIX HGR 80C ALT  "
 DFB " ","|",38
 ASC " |---memory-------breakpoints----stack--"
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",7,"<",EOT

MSGBORD2
 DFB " ","|",13
 ASC "|npt----range---|"
 DFB 8
 ASC " |--eff-adrs---|"
 DFB 15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",12,"<","|",15,"|",8
 DFB " ","|",13,"|",15,"|",8
 DFB " ","|",13,"|",15,"|",EOT

**************************************************
* TABLE1
* The numbers from 0 to 182, are offsets to the 2 bytes
* of the packed mnemonic in the mnemonic table. the opcode is
* the matrix position.

TABLE1 EQU *

*LSD-->   0 1 2 3 4 5 6 7 8 9 A B C D E F

 HEX 16522852A05204526252045EA0520452
 HEX 125252529E5204521E52369A9E520452
 HEX 420240020C0276026E02766C0C027602
 HEX 0E0202020C02760282022EA20C027602
 HEX 7A34B2344E344A345A344A603E344A34
 HEX 1A3434344C344A34223466983E344A34
 HEX 7E005800920078006800787C3E007800
 HEX 1C000000920078008600729C3E007800
 HEX 148A188A908A8E8A320CA65C908A8E8A
 HEX 068A8A8A908A8E8AAC8AA8AA928A928A
 HEX 48444644484446449644946A48444644
 HEX 08444444484446442444A4AE48444644
 HEX 2C2674262C262E263A2630B02C262E26
 HEX 1026262656262E262026648C3C262E26
 HEX 2A8088802A803680388050B42A803680
 HEX 0A80808054803680848070B642803680

****************************************
* THIS POINT MUST BE $CA00 OR ABOVE.
****************************************

***** LDA TABLE1,X *****

LTABLE1 CMP $C800 ;DISABLE EXT RAM
 LDA TABLE1,X
 CMP $CF00 ;ENABLE EXT RAM
 RTS

***** RDKEY *****
* Flash prompt & read char

TORDCHAR
 LDA CURSHORZ
 LSR ;DIVIDE BY 2
 STA MEMHORZ ;MEM POINTER
 BCS INMAIN ;ODD COLUMN, MAIN MEM

 BIT OFFFLAG ;DON'T CHANGE PAGE2 SWITCH
 BMI INMAIN ;IF OFF

* Input from aux mem

INAUX STA TXTPAGE2 ;AUX ON
 LDY MEMHORZ ;MEM POINTER
 LDA (BASL),Y ;GET EXISTING CHAR
 STA TXTPAGE1 ;MAIN ON
 PHA ;SAVE EXISTING CHAR
 AND #$A0 ;ALLOW ONLY SPACE
 ORA #$20 ;MAKE SURE ITS SPACE
 EOR #$80 ;INVERT THE SPACE
 JSR WRTAUXIN ;WRITE AUX, DELAY FOR FLASH

* Keypress will be detected with next KEYIN
* Normal char back to screen

 PLA ;GET ORIG. CHAR
 LDY MEMHORZ ;SCREEN MEM POINTER
 JSR WRTAUXIN ;PUT NORMAL CHAR BACK, DO KEYIN
 BMI KEYPRES ;IF KEY PRESSED
 BEQ INAUX ;<ALWAYS> KEEP LOOKING

* Input from main mem

INMAIN LDY MEMHORZ
 LDA (BASL),Y ;GET EXISTING CHAR
 PHA ;SAVE
 AND #$A0 ;ALLOW ONLY SPACE
 ORA #$20 ;MAKE SURE ITS SPACE
 EOR #$80 ;INVERT THE SPACE
 STA (BASL),Y
 JSR KEYIN ;DELAY FOR FLASH RATE

* Keypress detected by next KEYIN
* Normal char back

 PLA ;GET ORIG CHAR
 LDY MEMHORZ ;SCREEN MEM POINTER
 STA (BASL),Y ;PUT ORIG. CHAR BACK
 JSR KEYIN ;CHECK FOR KEYPRESS
 BMI KEYPRES
 BEQ INMAIN ;<ALWAYS> KEEP LOOKING
KEYPRES EQU *

* Key click

 LDY #10
KEYCLIK LDA #8
 JSR TRANSFR6 ;WAIT
 DFB WAITC ;code
 LDA SPKR
 DEY
 BNE KEYCLIK
 LDA KBD ;GET KEYCODE
 BIT KBDSTRB
 RTS

* Display char to aux mem and fall thru to KEYIN

WRTAUXIN STA TXTPAGE2 ;AUX ON
 STA (BASL),Y ;PUT ON SCREEN
 STA TXTPAGE1 ;MAIN ON

* Check for a keypress & delay for flash rate.
* Check for keypress must be in this loop to avoid
* a waiting for end of flash.

KEYIN LDY #00
KEYIN2 LDA #20
 JSR TRANSFR6 ;SMALL DELAY
 DFB WAITC ;code
 BIT KBD ;CHECK FOR KEYPRES
 BMI KEYINRTS ;YES KEY PRESSED
 DEY
 BNE KEYIN2 ;NO KEEP LOOKING
KEYINRTS
 RTS

*----------------------------------------
* DDT vectors

DDT0070 JSL $E0C080 ;the 80 is replaced with $80+n0
DDT3FB JSR $C080 ; "  "       "


*----------------------------------------
* Restore Stuff before executing user's program
* Also sets up SEG 7 I/O routines

RESTSTUF

* Restore the main & aux ram switches
* Both switches are currently set for main ram.

 LDA MSTATE ;GET MACHINE STATE FLAG
 ASL
 BPL :READM ;IF READ FROM MAIN
 STA READAUX ;IF NOT, SET READ FROM AUX RAM
:READM ASL
 BPL :WRITEM ;IF WRITE TO MAIN
 STA WRITAUX ;IF NOT, SET WRITE TO AUX RAM
:WRITEM

 LDA PBR8 ;PBR8 from previous instructions
 PHA

 LDA #$07 ;low byte needed to turn CXROM on
 BIT CXSTATUS ;WAS CXROM ON?
 BMI :SETCX ;IF YES
 LDA #$06 ;low byte needed to keep CXROM off
:SETCX PHA ;for CXROM switch

 LDA ACC
 PHA ;for ACC restore byte

******************************************
* !!! CAUTION !!! SEGMENT DEPENDENT CODE *
******************************************
 LDX SLOTN0
 LDA #%01110110 ;RAM7, ROM6
 STA SEGMBASE,X

 PLA
 STA IOACC ;set user's ACC
 PLA
 STA IOCX7 ;set user's CXROM

 PLA  ;PBR8
 BEQ :USERTI ;native mode or 8 bit in bank 0
 LDA #$6B ;RTL opcode
 STA IORTL ;put in SEG7 IO
 LDA #$28 ;PLP opcode
 BRA :PUTCODE
:USERTI LDA #$40 ;RTI opcode
:PUTCODE STA IORTI ;put opcode in SEG7 IO code

******************************************
* !!! CAUTION !!! SEGMENT DEPENDENT CODE *
******************************************
 LDA #%00000110 ;RAM0, ROM6
 STA SEGMBASE,X

* Replace the GS vectors.

 LDX #3
 BRA :SKIP ;3FB vector is only 3 bytes
:REPEAT LDAL $0003FB,X
 STA V0003FB,X ;save user's vector
 LDAL $0103FB,X
 STA V0103FB,X ;save AUX mem vector
 LDA DDT3FB,X ;get DDT vector
 STAL $0003FB,X ;replace user's vectors
 STAL $0103FB,X ;replace user's AUX vector
:SKIP LDAL $E10070,X
 STA VE10070,X ;save user's vector
 LDA DDT0070,X ;get DDT vector
 STAL $E10070,X ;replace user's vectors
 DEX
 BPL :REPEAT ;until X < 0
* Correct for proper slot number
 LDA SLOTN0
 ORA #C0INT ;create slot $80+n0
 STAL $0003FB+1
 STAL $0103FB+1
 STAL $E10070+1
:ENDI

*----------------------------------------
* If the user is in emulation mode then.
*   Check for instructions that will alter the PBR and manually update the PBR

 LDA PBR
 STA DBRDDT ;bank to access with LDAINDY
 INDEX16
 LDX PCLO
 STX LOWADD
 INDEX8
 BIT EMULATE ;Emulation mode?
 BPL :NATIVE ;if no
 LDA USEROPCD ;get user's opcode
 LDY #$3 ;PBR offset
 CMP #$5C ;is it JML ?
 BEQ :ITIS5C ;if yes
 CMP #$22 ;is instruction JSL ?
 BNE :CKDC ;if no
* Opcode is JML or JSL so read destination PBR
:ITIS5C JSR TRANSFR6
 DFB LDAINDYC ;get PBR from instruction
 BRA :SETPBR

:CKDC CMP #$DC ;is opcode JMP [XXXX] ?
 BNE :CK6B ;if no
* Opcode is JMP [xxxx]
 LDY #1
 JSR TRANSFR6
 DFB LDAINDYC ;get low byte of indirect addrs
 PHA ;save
 INY
 JSR TRANSFR6
 DFB LDAINDYC ;get hi byte of indirect addrs
 STA HIADD
 PLA
 STA LOWADD
 STZ DBRDDT
 JSR TRANSFR6
 DFB LDAINDYC ;Y=2 so we read PBR
 BRA :SETPBR

:CK6B CMP #$6B ;is opcode RTL ?
 BEQ :doRTL ;if yes
 LDA PBR8 ;keep current PBR8
 BRA :setPBR
* Opcode is RTL
:doRTL MX16
 TSC
 LDX STACK
 TXS ;restore user's stack pointer
 MX8
 SEC
 XCE ;do emulation mode so stack works the same
 PLX
 PLX
 PLX ;get PBR from stack
 XCE ;return to native mode
 TCS ;restore our stack pointer
 TXA
 BRA :setPBR
:NATIVE LDA #0 ;clear PBR8 when native mode
:setPBR PHA ;save PBR8

 LDA PBR8 ;PBR8 from previous instructions
 BEQ :NORTL ;if RTL will not be used in SEG7IO
 MEMORY16
 DEC PCLO ;RTL in SEG7IO will increment by 1
 MEMORY8
:NORTL PLA
 STA PBR8 ;PBR8 for current instruction

*----------------------------------------
* Restore the display switches. If invisible mode is set, exchange
* the DDT text buffer with the text screen. Make sure $C0C0 stuff is ok
* for handling high speed traps.
*----------------------------------------

RESTTEXT
 BIT RESTFLAG ;HAVE DISPLAY ROUTINES BEEN USED?
 BPL SET80S ;NO, SO SCREEN IS OK
 LDA #00
 STA RESTFLAG ;CLEAR FLAG
 BIT OFFFLAG ;IS DISPLAY TURNED OFF?
 BMI SET80S ;IF OFF THEN SKIP

* RESTORE APPLE'S BASL - BAS2H, CHANGED BY EXT SCREEN OUTPUT
 LDX #3 ;4 BYTES
:NEXT LDA BASBUF,X ;GET FROM EXT BUF
 STA BASL,X ;PUT IN APPLE'S RAM
 DEX
 BPL :NEXT

 BIT INVISIBL ;CHECK INVISIBLE MODE FLAG
 BPL RESTDISP ;NOT INVISIBLE MODE SO DON'T RESTORE TEXT PAGE

 JSR EXCHTEXT ;EXCHANGE TEXT

* Restore display switches.
* Set the following switches: 80COL, ALTCHARSET

RESTDISP LDA DISPFLAG ;GET FLAGS
 LDX #$C ;SWITCH OFFSET
NEXTSW1 LSR ;SET CARRY WITH BIT 0
 BCS SWCHON1 ;TURN VIDEO SWITCH ON
 STA $C000,X ;SET SWITCH OFF
 BCC INCSW1 ;<ALWAYS> NEXT SWITCH
SWCHON1 STA $C001,X ;SWITCH ON
INCSW1 INX
 INX ;NEXT PAIR OF SWITCHES
 CPX #$10 ;ALL SET?
 BLT NEXTSW1 ;IF NO

* Set the following switches: HIRES, PAGE2, MIXED, TEXT

 LDX #$57 ;SWITCH OFFSET
NEXTSW2 LSR ;SET CARRY WITH BIT0
 BCS SWCHON2 ;TURN SWITCH ON
 STA $C000-1,X ;SWITCH OFF
 BCC DECSW1 ;<ALWAYS> NEXT SWITCH
SWCHON2 STA $C000,X ;SET SWITCH ON
DECSW1 DEX
 DEX ;NEXT SWITCH
 CPX #$50 ;ALL SET?
 BGE NEXTSW2 ;IF NO

* Restore Super Hi-Res display switch
 LDA SUPERSAV ;Saved condition
 STA SUPERHR ;Restore

* Restore the Text color
 LDA TEXTCLRS ;Saved color
 STA TEXTCOLR ;Restore

* Set 80 col switch always because it's changed by LDA & STA INDY

SET80S BIT DISPFLAG ;SET N BIT
 BMI SWCHON3 ;TURN SWITCH ON
 STA $C000 ;80STORE OFF
 BPL RESTRTS ;<ALWAYS>
SWCHON3 STA $C001 ;80STORE ON

RESTRTS RTS

*-------------------------------------------------
* Save the display switches. If invisible mdoe is set, exchange the text
* screen with DDT text buffer.

ZPAGSAVE

* Save Apple's BASL - BAS2H, changed by DDT screen output
 LDX #3 ;4 BYTES
:NEXT LDA BASL,X ;GET FROM APPLE
 STA BASBUF,X ;PUT IN EXT BUFFER
 DEX
 BPL :NEXT

* Save the display switches

* DISPFLAG format

*BIT7 = 80STORE
*BIT6 = VBL (NO USE)
*BIT5 = TEXT
*BIT4 = MIXED
*BIT3 = PAGE2
*BIT2 = HIRES
*BIT1 = ALTCHARSET
*BIT0 = 80COL

SAVEDISP LDA #0
 STA INITFLAG ;CLEAR (USERS PROGRAM RUN) FLAG
 LDX #7 ;SWITCH OFFSET
:SAVE
 LDA $C018,X ;GET STATUS
 AND #$80 ;STRIP ALL BUT MSB
 LSR DISPFLAG ;MAKE ROOM FOR NEXT FLAG
 ORA DISPFLAG ;MIX WITH OTHER FLAGS
 STA DISPFLAG ;SAVE RESULT
 DEX ;DEX FLAG COUNTER
 BPL :SAVE ;MORE FLAGS

* Save the Super Hi-Res switch
 LDA SUPERHR
 STA SUPERSAV

* Save the text color
* LDA TEXTCOLR
* STA TEXTCLRS

 BIT INVISIBL ;TEST INVISIBLE MODE
 BPL RESTRTS ;NOT INV. MODE
 BIT OFFFLAG ;IS DISPLAY OFF ?
 BMI RESTRTS ;IF OFF, SKIP EXCHANGE

 JSR EXCHTEXT ;EXCHANGE TEXT WITH EXT BUF

 JMP RESTDISP ;RESTORE DISPLAY SWITCHES & RTS

***** SETMSTAT *****
* Memory state register (not the same as EDM ROMS or IIGS)
* used as indicator and for BANKCHEK, sets to current memory
* state so must be run before anything is changed.

* M=
* BIT 0=1 IF INTERNAL ROM ON ($C100-$CFFF) CXROM {$C015}
* BIT 1=1 IF 80 STORE ON {$C018}
* BIT 2=1 IF PAGE 2 ON {$C01C}
* BIT 3=1 IF LC BANK 2 IS IN  0= BANK 1 {$C011}
* BIT 4=1 IF LC IS BANKED IN  0= AUTOSTART ROM {$C012}
* BIT 5=1 IF AUX RAM BEING WRITTEN TO ($200-$BFFF) {$C014}
* BIT 6=1 IF AUX RAM BEING READ FROM ($200-$BFFF) {$C013}
* BIT 7=1 IF AUX STACK & ZP & LC ON {$C016}

* XOFFSET ; OFFSETS TO VARIOUS FLAG POSITIONS

XOFFSET HEX 05020301000B07

* Determine MSTATE
* Set bit 0 from stored info

SETMSTAT LDA CXSTATUS ;IS CXROM ON ?
 ROL
:CXOFF ROR MSTATE ;SET BIT 0

* Set bit 1-7 from current switches

 LDY #6
:SETM LDX XOFFSET,Y
 LDA $C011,X
 ROL
:NOTSET ROR MSTATE
 DEY
 BPL :SETM

**** Set RAMRD and RAMWRT switches to main RAM ****
 STA READMAIN ;READ FROM MAIN RAM
 STA WRITMAIN ;WRITE TO MAIN RAM

 RTS

***** SETMPBR *****
* Do SETMSTAT and BANKCHEK

SETMPBR JSR SETMSTAT
 LDX DBR
 PHX ;SAVE
 STZ DBR
 JSR TRANSFR6 ;BANKCHEK
 DFB BANKCHEKC ;code
 STA MEMPBR ;SET PBR
 PLX
 STX DBR ;RESTORE DBR
 RTS ;ACC = MEMPBR


*------------------------------------
*   SETPBR -  Set PBR if emulation mode & PBR is 00 or 01 set INITFLAG
*  If the PBR is other than 00 or 01 then the user might be running 8 bit
*  code in other banks, so don't change the PBR.

SETPBR LDA PCHI
 STA MEMHI ;USED BY SETMPBR
 BIT EMULATE
 BPL :PBROK

* If emulation mode, is PBR 00 or 01 ?
 LDA PBR
 AND #$FE
 BNE :PBROK ;PBR is not 00 or 01 so don't change

* Use setmpbr to set PBR.
 JSR SETMPBR ;DO SETMSTAT & BANKCHEK
 STA PBR

:PBROK LDA #$FF
 STA INITFLAG ;SET FLAG THAT USER'S PROGRAM HAS BEEN RUN.
 CLD
 RTS


* SUBROUTINES USED ABOVE

*-------------------------------------------------
* Exchange text RAM area with DDT RAM

EXCHTEXT

* Initialize pointers and RAM
 LDX #$5
:SAVE LDA $20,X ;SAVE Z PAGE
 STA ZPAGEXT,X ;USED WHEN SAVING TEXT RAM
 DEX
 BPL :SAVE

 LDA #0
 STA Z1LO
 LDA #$04
 STA Z1HI ;$400
 LDA #$11 ;$1-$10 ARE VIA
 STA Z2LO
 LDA #$C8
 STA Z2HI ;$C810
 LDX SLOTN0
 STX ZBUF5 ;SAVE TO Z PAGE

*********************************
*   W A R N I N G
* SEGMENT DEPENDENT CODE
*********************************

 LDA #%00100110 ;RAM2, ROM6
 STA SEGMBASE,X
 STA ZBUF6 ;SAVE SEG#
 LDX #00
 LDY #00
 STA STR80ON ;ENABLE AUX ACCESS
 STA TXTPAGE1 ;SELECT MAIN TEXT RAM

SAVENEXT LDA (Z1LO),Y ;GET FROM SCREEN
 PHA
 LDA (Z2LO,X) ;GET FROM EXT RAM
 STA (Z1LO),Y ;PUT ON SCREEN
 PLA ;GET SCREEN VALUE
 STA (Z2LO,X) ;SAVE TO EXT RAM
 JSR SVTXTINC ;RETURNS WITH CARRY SET WHEN DONE

* Exchange the aux mem portion of 80 col disp.

 STA TXTPAGE2 ;SELECT AUX MEM
 LDA (Z1LO),Y ;GET FROM SCREEN
 PHA
 LDA (Z2LO,X) ;GET FROM EXT RAM
 STA (Z1LO),Y ;PUT ON SCREEN
 PLA ;GET SCREEN VALUE
 STA (Z2LO,X) ;SAVE TO EXT RAM
 STA TXTPAGE1 ;SELECT MAIN MEM
 JSR INCTEXT
 BCC SAVENEXT

* RETURN RAM TO SEG 0

 LDX ZBUF5 ;GET SLOTN0 FROM Z PAGE BUFFER
*********************************
*  W A R N I N G
* THIS IS SEGMENT DEPENDENT CODE
*********************************
 LDA #%00000110 ;RAM0, ROM6
 STA SEGMBASE,X

* Restore Z page locations

 LDX #$5
:REST
 LDA ZPAGEXT,X
 STA $20,X ;RESTORE Z PAGE
 DEX
 BPL :REST

 RTS

* Inc. screen pointer

INCTEXT INY
 CPY #$79
 BLT SVTXTINC
 CPY #$80
 BLT INCTEXT
 CPY #$F9
 BLT SVTXTINC
 INC Z1HI
 LDA Z1HI
 CMP #$08
 BGE NEXTTEXT ;CARRY SET
 LDY #0

SVTXTINC CLC
 LDA Z2LO
 ADC #1
 STA Z2LO ;INC EXT RAM POINTER
 LDA Z2HI
 ADC #0
 CMP #$CA
 BLT THISSEG
 LDX ZBUF5 ;GET FROM Z PAGE BUFFER
 LDA ZBUF6 ;GET LAST SEG# USED
 CLC
 ADC #%00010000 ;NEXT RAM SEG
 STA ZBUF6 ;SAVE
 STA SEGMBASE,X
 LDX #0 ;RESET
 LDA #$11 ; $C801 - $C810 ARE VIA
 STA Z2LO
 LDA #$C8
THISSEG STA Z2HI
 CLC
NEXTTEXT RTS

*********************************
* Initialize DDT RAM
*********************************

INITRAMV LDA #0
 STA PBR ;DEFAULT TO BANK 0
 LDA #>MONITOR ; -SET UP PCHI & PCLO
 STA PCHI ; - TO RETURN TO MONITOR IF GO COMMAND IS
 STA MEMHI ; FOR BANKCHEK
 LDA #MONITOR ; - GIVEN WITHOUT CHANGING THE PROGRAM COUNTER
 STA PCLO ; - AFTER ENTERING AT START1.

* Was card selected by PR#n or IN#n

 LDA SLOTCN ;GET SLOT NUMBER CN
 CMP CSWH ;WAS PR#N USED ?
 BNE CHKKSW ;IF NO
 LDA #COUT1APL ;LOW ADDRESS BYTE
 STA CSWL ;PUT COUT1 ADDRESS IN
 LDA #>COUT1APL
 STA CSWH
CHKKSW LDA SLOTCN ;GET SLOT NUMBER CN
 CMP KSWH ;WAS IN#N USED
 BNE SETUP ;IF NO
 LDA #KEYIN ;PUT KEYIN ADDRESS IN
 STA KSWL
 LDA #>KEYIN
 STA KSWH

* Set display mode

SETUP LDA TEXTCOLR ;get user's text colors
 STA TEXTCLRS ;save for DDT use
 LDX #POINT-TCOUNT ;CLEAR EXT RAM FROM TCOUNT TO POINT
 LDA #00
 STA IOMODE ;SET TO SCREEN I/O
 STA OFFFLAG ;DISPLAY ON
:CLREXT STA TCOUNT,X
 DEX
 BPL :CLREXT
 LDA #$80 ;DEFAULT SETUP
 STA INVISIBL ;SO TEXT RAM IS SAVED DURING INITIALIZATION
 LDA #CTRLS
 STA KEY ;SET STOP KEY TO CTRL-S
 LDA #$40
 STA CMOSFLAG ;SET 65816 TYPE

* Initialize VIA

 LDA #%01111111 ;DISABLE INTERRUPTS
 STA VIAIER
 LDA #$FF
 STA VIADRA ;MAKE ALL A LINES OUTPUTS
 STA VIADRB ;" " " B " "
 LDA #0
 STA VIAACR ;SET UP TIMERS
 LDA #%11111110 ;DON'T REPLACE APPLE'S VECTORS WHILE IN EXTERM
 STA VIAPCR ;SET UP CA1,CA2,CB1
 LDA #%10000010
 STA IERBUFF ;INTERRUPTS TO ENABLE

* Move interrupt, CXROM routines to DDT RAM

 JSR TRANSFR6
 DFB ROMTORAMC ;code
 BRA INITCONT

*-------------------------------------------------
* WARM ENTRY COMES HERE
* Check the GS ^Y vector and restore if necessary

WARMINIT LDAL $0003FA ;GS ^Y slot number
 CMP SLOTCN ;does it point to our slot?
 BNE INITCONT ;if no
 LDX #2 ;3 bytes to restore
:REPEAT LDA DDT3F8,X ;get user's ^Y vector
 STAL $0003F8,X ;restore GS ^Y
 DEX
 BPL :REPEAT

INITCONT JSR ZPAGSAVE ;SAVE DISPLAY SWITCHES
 JSR SETMPBR ;SET MSTATE & PBR
 JSR DISPON ;TURN DISPLAY ON
 JSR TRANSFR6 ;display copyright
 DFB DSCOPYRC ;code
 LDA STACK
 STA OLDSTACK ;INIT FOR STACK DISPLAY
 RTS

*-------------------------------------------------
* Display window borders

DSPBORDR

* Don't display if not screen I/O
 LDA IOMODE
 BNE :END

* Set full screen window with left edge in col 42

 LDA #0
 STA WINDTOP
 LDA #40
 STA WINDLEFT
 STA WINDWDTH
 LDA #24
 STA WINDBTM
 JSR TRANSFR6 ;HOME
 DFB HOMEC ;code

* Display borders

 PEA MSGBORDR ;message location
 JSR WRITE6 ;display it
 PEA MSGBORD2 ;message part 2
 JSR WRITE6 ;display it

 JSR TRANSFR6 ;CLEAR LOWER RIGHT CORNER
 DFB CLREOLC ;code

:END RTS

****************************************
* MUST BE BEFORE $CF00
****************************************

*---------------------------------
* Write text to the display device
* The address of the text is on the stack
* Positive numbers in message are RLE compressed number of spaces

WRITE6 STY YBUFF ;SAVE
 LDY #0
WRITLOP6
 CMP $C800 ;disable DDT RAM
 LDA (3,S),Y ;get character to display
 CMP $CF00 ;enable DDT RAM
 INY ;next character
 CMP #EOT ;finished?
 BEQ :DONE ;if yes
 AND #$FF ;SET FLAGS
 BPL :SPACES ;if coded spaces

 JSR TRANSFR6 ;display character
 DFB COUTC ;code
 BRA WRITLOP6 ;loop until done

:SPACES TAX
 JSR TRANSFR6 ;PRINT SPACES
 DFB PRBL2C ;code
 BRA WRITLOP6 ;loop until done

:DONE MEMORY16
 PLA ;get return address
 STA 1,S ;free parameter space
 MEMORY8
 LDY YBUFF ;RESTORE
 RTS

*-------------------------------------------------
* Pascal 1.1 interface routines
* X & Y preserved

* Initialize pascal slot
INITPASC LDA #$0D ;low address byte of Pascal 1.1 init offset
 BRA GOPASCAL

* Wait for and get next character
INPASCAL LDA #$0E ;low address byte of Pascal 1.1 read offset
 BRA GOPASCAL

* Get port status
STATPASC XBA  ;save request code
 LDA #$10 ;low address byte of Pascal 1.1 status offset
 BRA GOPASCAL

* Send a character out pascal slot
OUTPASCL PHA  ;save character
:LFEED AND #$7F ;STRIP PARITY
 PHA  ;save char to write
:TXFULL LDA #$0 ;request code, 'are you ready for output?'
 JSR STATPASC ;get serial I/O status
 BCC :TXFULL
 PLA  ;char to write
 PHA
 XBA  ;set Acc
 LDA #$0F ;low address byte of Pascal 1.1 write offset
 JSR GOPASCAL ;send character
 PLA  ;character wrote
 CMP #CR&$7F ;CARRIAGE RETURN?
 BNE :EXIT ;NO
 JSR TRANSFR6 ;DELAY FOR CR
 DFB WAITC ;code
 LDA #LF
 BRA :LFEED ;DO LINE FEED
:EXIT PLA  ;restore character
 RTS

*-------------------------------------------------
* Call the Pascal I/O interface routine. Must use TRANSFRx so we return
* to proper segment.

GOPASCAL PHX
 PHY
 JSR TRANSFR6 ;go to pascal 1.1 routine
 DFB PASCALIOC ;code
 ORA #$80 ;strip parity if input
 PLY
 PLX
 RTS

*-----------------------------------------------------
* Swap the work stack area with the work stack buffer.
* Place the stack in DDTSTACK.
* Work stack must be in Main RAM.

STKSWAP LDX #WSTKLGTH ;LENGTH OF WORK STACK

:WHILE LDY WSTKBUFF,X ;GET DATA FROM DDT RAM BUFFER
 LDAL WORKSTAK-WSTKLGTH,X ;GET DATA FROM WORK STACK
 STA WSTKBUFF,X ;PUT IN DDT RAM BUFFER
 TYA
 STAL WORKSTAK-WSTKLGTH,X ;PUT IN STACK RAM
 DEX
 BNE :WHILE
 RTS

*-------------------------------------------------
* Display all windows & set to windDR if display is on

DISPON BIT OFFFLAG ;IS DISPLAY OFF?
 BMI :ISOFF ;IF YES SKIP DISPLAY

 LSR WINDFLG ;indicate windows are on
 JSR TRANSFR6 ;SET EXT DISPLAY SWITCHES
 DFB SETSCRNC ;code
 JSR DSPBORDR ;DISPLAY BORDERS
 JSR TRANSFR6 ;DISPLAY FLAG,MEM,EFF,STK WINDOWS
 DFB DISFMESC ;code
 JSR TRANSFR6 ;DISPLAY BRK WINDOW
 DFB DISBRKWC ;code
 JSR TRANSFR6 ;DISPLAY PROT WINDOW
 DFB DISPROTWC ;code
 JSR TRANSFR6 ;set DR window
 DFB WINDDRC ;code
:ISOFF RTS
 MX %11

*-------------------------------------------------
* INITIALIZE MEMLOW, MEMHI, Qreg & display registers

INITDISR LDA PCLO
 STA MEMLOW  ;UPDATE THE MEMORY POINTER
 LDA PCHI
 STA MEMHI
 LDA PBR  ;GET CURRENT BANK
 STA MEMPBR
 LDA SPEEDREG
 AND #$80 ;get speed bit
 STA QREG
 LDA SHADOW
 AND #$7F ;get shadow stuff
 TSB QREG ;update Qreg

*-------------------------------------------------
* Display the contents of the registers and disassemble the current
* instruction. Returns with C=1 if at a breakpoint.

* Note, got to do this the hard way so it works with printers,
* dumb terms, etc.

 JSR TRANSFR6 ;is the instruction our break
 DFB VALIDPCC ; code
 BMI NOTBREAK ;NOT OURS OR NOT BREAK
* is break
 JSR TRANSFR6 ;DISPLAY "BREAKPOINT"
 DFB DISBREAKC ; code
 LDY YBUFF ;RESTORE AFTER WRITE
 JSR TRANSFR6 ;PUT ORIG. INST BACK IN
 DFB REPLACEC ; code
 STA SBTYPE  ;TYPE OF BRK REPLACED
 CMP #"I"  ;WAS IT IMPLIED BRK ?
 BEQ :DISP  ;IF YES
 INC REALBRK  ;REAL BRK COUNTER
:DISP JSR TRANSFR6 ;DISASSEMBLE AND DISPLAY
 DFB DISREG2C ; code
 LDA SBTYPE
 CMP #"I"  ;WAS IT IMPLIED BRK ?
 BEQ :INC  ;IF YES
 LDA #0
 TAY
 JSR TRANSFR6 ;PUT REAL BRK BACK IN
 DFB STAPCIYC ; code
:INC INC POINT  ;POINT TO OLD BRK INFO
 LDY YBUFF  ;RESTORE Y

UPDBRKW JSR TRANSFR6 ;UPDATE BRK WINDOW
 DFB DISBRKWC ;code
 LSR BRKWFLG  ;CLEAR FLAG

 JSR TRANSFR6 ;SET DR WINDOW
 DFB WINDDRC ; code
 SEC   ;INDICATES A BRK
 RTS   ;LEAVE

* Not our break
NOTBREAK JSR TRANSFR6 ; display registers
 DFB DISREG2C ; code

* Does the BRK window need updating ?
 BIT BRKWFLG
 BPL :NOBRK  ;IF NO
 JSR UPDBRKW ;IF YES
:NOBRK CLC   ;NO BRK
 RTS   ;RETURN

*-------------------------------------------------
* Display hardware breakpoint stuff

DSPHBP LDA IERBUFF  ;GET IER BUFFER
 AND #%00010000 ;STRIP ALL BUT CB1 FLAG
 BEQ HARDBOFF ;DISABLED

* Display X/ if HALT_ALL set.
 BIT HALT_ALL
 BPL :NO
 LDA #"X"
 JSR TRANSFR6
 DFB COUTC  ;code
 BRA :SLASH

:NO LDA HARDPBR  ;BANK #
 JSR TRANSFR6
 DFB PRBYTEC
:SLASH LDA #"/"
 JSR TRANSFR6 ;PRINT "/"
 DFB COUTC  ;code
 LDA VIAORB
 JSR TRANSFR6 ;PRINT HI BYTE OF ADDRESS
 DFB PRBYTEC  ;CODE
 LDA VIAORA
 JSR TRANSFR6 ;PRINT LOW BYTE OF ADDRESS
 DFB PRBYTEC  ;CODE
HARDBOFF
 RTS

*-------------------------------------------------
* Set window for DR

WINDDR LDA #0
 STA WINDLEFT
 STA WINDTOP
 STA CURSHORZ ;LEFT EDGE OF WINDOW
 LDA #41
 STA WINDWDTH
 LDA #24
 STA WINDBTM
 LDA #23
 STA CURSVERT ;BOTTOM LINE
 JSR TRANSFR6 ;SET UP BASL BASH
 DFB VTABC  ;CODE
 RTS


***** THIS SEGMENTS GLOBAL SUBROUTINES *****

SUBTABL6

LTABLE1C EQU *-SUBTABL6*4+6+$100
 DA LTABLE1-1

TORDCHARC EQU *-SUBTABL6*4+6+$100
 DA TORDCHAR-1

RESTSTUFC EQU *-SUBTABL6*4+6+$100
 DA RESTSTUF-1

RESTTEXTC EQU *-SUBTABL6*4+6+$100
 DA RESTTEXT-1

RESTDISPC EQU *-SUBTABL6*4+6+$100
 DA RESTDISP-1

ZPAGSAVEC EQU *-SUBTABL6*4+6+$100
 DA ZPAGSAVE-1

SAVEDISPC EQU *-SUBTABL6*4+6+$100
 DA SAVEDISP-1

INITRAMVC EQU *-SUBTABL6*4+6+$100
 DA INITRAMV-1

SETMSTATC EQU *-SUBTABL6*4+6+$100
 DA SETMSTAT-1

SETMPBRC EQU *-SUBTABL6*4+6+$100
 DA SETMPBR-1

SETPBRC EQU *-SUBTABL6*4+6+$100
 DA SETPBR-1

INITPASCC EQU *-SUBTABL6*4+6+$100
 DA INITPASC-1

INPASCALC EQU *-SUBTABL6*4+6+$100
 DA INPASCAL-1

STATPASCC EQU *-SUBTABL6*4+6+$100
 DA STATPASC-1

OUTPASCLC EQU *-SUBTABL6*4+6+$100
 DA OUTPASCL-1

WARMINITC EQU *-SUBTABL6*4+6+$100
 DA WARMINIT-1

STKSWAPC EQU *-SUBTABL6*4+6+$100
 DA STKSWAP-1

DISPONC EQU *-SUBTABL6*4+6+$100
 DA DISPON-1

INITDISRC EQU *-SUBTABL6*4+6+$100
 DA INITDISR-1

DSPHBPC EQU *-SUBTABL6*4+6+$100
 DA DSPHBP-1

WINDDRC EQU *-SUBTABL6*4+6+$100
 DA WINDDR-1

*****************************************
*  SEGMENT CROSSOVER AREA  *
*****************************************

 LST ON
S6END = $E0CF91-*
 do nolist
 LST OFF
 fin
 ERR *-1/$E0CF91
 DS $E0CF91-*,$FF


******** SAVE THE ACC, X, Y AND P REGISTERS *******
* Returns with MX = 11, saves registers

SAVEAXP6
 PHP ;SAVE STATUS
 MX16
 STX XSAVESEG ;save 16 bits
 STY YSAVESEG ;save 16 bits
 STA ASAVESEG ;save 16 bits
 MX8
 PLA ;GET STATUS
 STA PSAVESEG ;SAVE
 RTS

****** RESTORE THE ACC, X, Y AND P REGISTERS ******
* restores registers

RESTAXP6
 MEMORY8
 LDA PSAVESEG
 PHA
 MX16
 LDX XSAVESEG
 LDY YSAVESEG
 LDA ASAVESEG
 PLP
 RTS
 MX %11

*----------------------------------------
* Do a direct transfer to other segments

JUMPSEG6
 JSR SAVEAXP6
 LDY SLOTN0
 PLA ;pull junk byte from dest. seg
 PLA ;get destination segment
 STA SEGMBASE,Y ;the next inst' will be in new seg
 JSR RESTAXP6 ;restore after xfer from other seg
 RTS ;pull destination address from stack

* TRANSFER TO OTHER SEGMENTS

TRANSFR6

 JSR SAVEAXP6
 MEMORY16
 PLA ;get return address from stack
 INC ;inc to point at code byte & for RTS
 PHA
 MEMORY8
 LDA #6 ;CURRENT SEG #
 PHA
 LDY #0
 LDA (2,S),Y ;GET CODE BYTE
 PHA ;SAVE CODE
 AND #$07 ;STRIP ALL BUT SEG #
 LDY SLOTN0
 STA SEGMBASE,Y ;NEXT INSTR. RUN FROM NEW SEGMENT
* NEW SEGMENT
 PLA ;GET CODE
 PEA RETURN6
 AND #$F8 ;STIP OFF SEG# LEAVING SUB #
 LSR
 LSR ;LEAVE SUB# MULTIPLIED BY 2
* GET ADDRESS OF SUB FROM SUBTABL & PUSH ON STACK
 TAY
 MEMORY16
 LDA SUBTABL6,Y
 PHA
 BRA RESTAXP6 ;RESTORE REGISTERS, RTS TO SUBROUTINE
 MX %11

* RETURN HERE FROM SUBROUTINE

RETURN6 EQU *-1
 JSR SAVEAXP6
 PLA ;SEG # TO RETURN TO
 LDY SLOTN0
 STA SEGMBASE,Y ;RETURN TO SEGMENT
 BRA RESTAXP6

 DS \,$FF ;PUT OBJECT AT NEXT PAG
